// This file is part of OpenMeca, an easy software to do mechanical simulation.
//
// Author(s)    :  - Damien ANDRE  <openmeca@gmail.com>
//
// Copyright (C) 2012 Damien ANDRE
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.


#include <QFile>
#include <QDomDocument>
#include <QDomNode>


#include "OpenMeca/Core/CommonProperty.hpp"
#include "OpenMeca/Core/XmlConfigFile.hpp"
#include "OpenMeca/Gui/MainWindow.hpp"


namespace OpenMeca
{
  namespace Core
  {
    std::map<const std::string, CommonProperty* > CommonProperty::registeredClasses_ = std::map<const std::string, CommonProperty* >();

    void 
    CommonProperty::AddClass(const std::string id, CommonProperty& theClass)
    {
      if (registeredClasses_.count(id)!=0)
	{
	  std::cout << "debug, id is " << id << std::endl;
	  std::map<const std::string, CommonProperty*>::iterator it;
	  for (it = registeredClasses_.begin(); it != registeredClasses_.end(); it++)
	    std::cout << (*it).first << std::endl;
	}
      assert(registeredClasses_.count(id)==0);
      registeredClasses_[id] = &theClass;
    }

    CommonProperty&
    CommonProperty::GetClass(const std::string id)
    {
      std::cout << "CommonProperty::GetClass with id=" << id << std::endl;
      assert(registeredClasses_.count(id)==1);
      return *registeredClasses_[id];
    }
   

    CommonProperty::CommonProperty()
      :registeredActions_(),
       registeredPopUpActions_(),
       popUpMenu_()
    {
    }

    CommonProperty::~CommonProperty()
    {
    }
    
    void 
    CommonProperty::AddAction(Action& action)
    {
      assert(registeredActions_.count(action.text().toStdString())==0);
      registeredActions_[action.text().toStdString()] = &action;
    }

    void 
    CommonProperty::AddPopUpAction(Action& action)
    {
      assert(registeredPopUpActions_.count(action.text().toStdString())==0);
      registeredPopUpActions_[action.text().toStdString()] = &action;
      popUpMenu_.addAction(&action);
    }

    Action& 
    CommonProperty::GetAction(const std::string id)
    {
      assert(registeredActions_.count(id)==1);
      return *registeredActions_[id];
    }

    QMenu&
    CommonProperty::GetPopUpMenu()
    {
      return popUpMenu_;
    }

  }
}

